package ocg.common.re.reports;

import com.aventstack.extentreports.ExtentTest;
import com.aventstack.extentreports.MediaEntityBuilder;
import com.aventstack.extentreports.MediaEntityModelProvider;
import com.aventstack.extentreports.markuputils.ExtentColor;
import com.aventstack.extentreports.markuputils.Markup;
import com.aventstack.extentreports.markuputils.MarkupHelper;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 创建 ExtentTest 测试对象
 * 提供 ExtentTest 的测试方法
 * 添加测试节点，定义的是等级
 * |等级一
 *      |等级二
 *          |等级三
 *              |·····
 */
public class TestReport {

    private ExtentTest extentTest;

    /**
     * ----------------------
     *      extentTest 值传递
     * ----------------------
     */

    /**
     * 不允许外部访问
     */
    TestReport(){}

    /**
     * 创建测试：测试等级一
     * @param testName      测试名称
     */
    public TestReport(String testName ){
        extentTest = ExtentManager.createTest( testName );
    }

    /**
     * 创建测试：测试等级一
     * @param testName      测试名称
     * @param description   测试描述
     */
    public TestReport(String testName , String description){
        extentTest = ExtentManager.createTest( testName ,description);
    }


    /**
     * 创建测试：测试等级小于一
     * @param parentTest        上一级测试对象
     * @param testName          测试名称
     */
    public TestReport(ExtentTest parentTest , String testName){
        extentTest = ExtentManager.createNodeTest( parentTest , testName );
    }

    /**
     * 创建测试：测试等级小于一
     * @param parentTest        上一级测试对象
     * @param testName          测试名称
     * @param description       测试描述
     */
    public TestReport(ExtentTest parentTest , String testName , String description){
        extentTest = ExtentManager.createNodeTest( parentTest , testName ,description);
    }

    /**
     * 获取 ExtentTest 测试对象
     * @return      ExtentTest
     */
    public ExtentTest get() {
        return extentTest;
    }

    /**
     * ----------------------
     *      日志级别：info
     * ----------------------
     */

    /**
     * 日志等级 info
     * @param details   描述
     * @return          this
     */
    public TestReport info( String details ){
        extentTest.info( details );
        return this;
    }

    /**
     * 添加截图
     * @param details   描述
     * @param path      图像路径
     * @return          this
     */
    public TestReport info( String details , String path){
        try {
            MediaEntityModelProvider mediaModel = MediaEntityBuilder.createScreenCaptureFromPath( path ).build();
            extentTest.info( details ,mediaModel);
        } catch (IOException e) {
            log_error(e);
        }
        return this;
    }

    /**
     * 失败
     * @param label       标签
     * @return            this
     */
    public TestReport infoColor( String label){
        Markup m = MarkupHelper.createLabel( label , ExtentColor.BLUE);
        extentTest.info(m);
        return this;
    }

    /**
     * 日志等级 info
     * @param details   描述
     * @param label     标签
     * @return          this
     */
    public TestReport log_info( String label, String details ){
        infoColor(label);
        extentTest.info( details );
        return this;
    }

    /**
     * Map<String,String> 以表格形式输出
     * @param label         标签
     * @param map           Map<String,String>
     * @return              this
     */
    public TestReport log_info( String label , Map<String,String> map ){
        infoColor( label );
        int line = map.size();
        if ( line >0) {
            String[][] data = new String[line][2];
            Set<String> keys = map.keySet();
            List<String> list = new ArrayList<>();
            for (String s : keys) {
                list.add(s);
            }
            for (int i = 0; i < list.size(); i++) {
                String key = list.get(i);
                data[i][0] = key;
                data[i][1] = map.get(key);
            }
            extentTest.info(MarkupHelper.createTable(data));
        }
        return this;
    }

    /**
     * String[][] 以表格形式输出
     * @param label     标签
     * @param data      String[][]
     * @return          this
     */
    public TestReport log_info(String label , String[][] data ){
        infoColor( label );
        extentTest.info(MarkupHelper.createTable(data));
        return this;
    }

    public TestReport log_info(String label , String[] data ){
        String[][] value = new String[data.length][2];
        for (int i = 0; i < data.length; i++) {
            value[i][0] = "";
            value[i][1] = data[i];
        }
        infoColor( label );
        extentTest.info(MarkupHelper.createTable(value));
        return this;
    }

    /**
     * 文本域
     * @param label     标签
     * @param code      数据
     * @return      this
     */
    public TestReport log_info_Code(String label,String code){
        infoColor( label );
        extentTest.info(MarkupHelper.createCodeBlock(code));
        return this;
    }

    /**
     * ----------------------
     *      日志级别：error
     * ----------------------
     */

    /**
     * 异常日志
     * @param details       描述
     */
    public TestReport error( String details ){
        extentTest.error( details );
        return this;
    }

    /**
     * 异常加入截图
     * @param details   描述
     * @param path      图像路径
     * @return          this
     */
    public TestReport error( String details , String path){
        try {
            MediaEntityModelProvider mediaModel = MediaEntityBuilder.createScreenCaptureFromPath( path ).build();
            extentTest.error( details,mediaModel );
        } catch (IOException e) {
            log_error(e);
        }
        return this;
    }

    /**
     * 失败
     * @param details       描述
     * @return              this
     */
    public TestReport errorColor(String details){
        Markup m = MarkupHelper.createLabel( details , ExtentColor.RED);
        extentTest.error(m);
        return this;
    }

    /**
     * 异常日志
     * @param e    异常类型
     */
    public TestReport log_error( Throwable e ){
        errorColor("异常:");
        extentTest.error( e );
        return this;
    }

    /**
     *
     * @param label         标签
     * @param details       描述
     * @return              this
     */
    public TestReport log_error( String label ,String details){
        errorColor(label);
        extentTest.error(details);
        return this;
    }

    /**
     * ----------------------
     *      日志级别：pass
     * ----------------------
     */

    /**
     * 成功
     * @param details       描述
     * @return              this
     */
    public TestReport pass(String details){
        Markup m = MarkupHelper.createLabel( details , ExtentColor.GREEN);
        extentTest.pass(m);
        return this;
    }

    /**
     * ----------------------
     *      日志级别：skip
     * ----------------------
     */

    /**
     * 跳过
     * @param details       描述
     * @return              this
     */
    public TestReport skip(String details){
        Markup m = MarkupHelper.createLabel( details , ExtentColor.YELLOW);
        extentTest.skip(m);
        return this;
    }

    /**
     * 跳过
     * @param t       异常
     * @return              this
     */
    public TestReport skip(Throwable t){
        extentTest.skip(t);
        return this;
    }

    /**
     * ----------------------
     *      日志级别：fail
     * ----------------------
     */

    /**
     * 失败
     * @param details       描述
     * @return              this
     */
    public TestReport fail(String details){
        Markup m = MarkupHelper.createLabel( details , ExtentColor.RED);
        extentTest.fail(m);
        return this;
    }

    /**
     *
     * @param t     异常
     * @return      this
     */
    public TestReport fail(Throwable t){
        extentTest.fail(t);
        return this;
    }

    /**
     * ----------------------
     *      添加图像
     * ----------------------
     */

    /**
     * 在报表中添加截图/图像
     * @param path      图像路径
     */
    public void addImagePath( String path , String title ){
        try {
            extentTest.addScreenCaptureFromPath(path,title);
        } catch (IOException e) {
            log_error( e );
        }
    }


}
